본문으로 건너뛰기
Sourcegithub.com

The Effect of Dynamic Date Injection Methods on LLM Temporal Reasoning across Deictic Expression Granularities

· 약 8분
김성연
AI Research Engineer, Brain Crew
최재훈
LEAD (AI Research Engineer), Brain Crew

TL;DR

LLM은 "어제", "다음 주"와 같은 상대적 시간 표현을 해석할 때 현재 날짜를 알 수 없어 날짜 주입이 필수입니다. 320회의 실험 결과, 한국어 형식(2025년 3월 19일) + User Prompt 조합이 Simple/Structured 모두에서 95% 정확도를 달성했으며, 날짜 미주입 시 15%에 불과했던 성능이 최대 95%까지 향상되었습니다. 특히 Week granularity(다음 주 월요일 등)는 요일 정보 포함 시 40%→80% 개선되며, gpt-4o 사용 시 모든 시간 단위에서 100% 정확도를 보였습니다.

Key Takeaways

  • 날짜 주입은 선택이 아닌 필수: 날짜 정보 없이는 Day/Week/Month granularity에서 0% 정확도를 기록하며, Year 단위 상식 문제만 60% 수준으로 부분 정답 가능
  • 한국어 질의에는 한국어 날짜 형식 사용: 현재 날짜: 2025년 3월 19일 형식이 Structured Output에서 English 대비 +15%p 우위(95% vs 80%)를 보이며 응답 방식에 관계없이 안정적
  • User Prompt가 System Prompt보다 효과적: 질의와 가까운 위치에 날짜를 배치하면 Simple Response에서 +3.3%p 성능 향상(95.0% vs 91.7%)
  • Week granularity가 가장 어렵다: "다음 주 월요일" 같은 표현은 현재 요일 인식→주 경계 판단→날짜 계산의 3단계 추론이 필요하며, 한국어 요일 정보 추가 시 40%→80% 개선
  • 과도한 정보는 오히려 역효과: 주말 설명 등 불필요한 부가 정보는 LLM의 추론을 방해하여 5~10%p 성능 하락 유발

상세 내용

배경: 왜 날짜 프롬프트가 필요한가

LLM은 학습 데이터의 시점에 고정되어 있어 "지금이 언제인지" 스스로 알 수 없습니다. 따라서 "어제", "지난주", "다음 달"과 같은 **직시 표현(Deictic Expression)**을 해석할 때 현재 날짜를 기준점으로 제공해야 정확한 날짜 변환이 가능합니다.

600회의 추론 실험(gpt-4o-mini 기준)에서 날짜 주입 유무에 따른 성능 차이는 다음과 같습니다:

조건AccuracyDayWeekMonthYear
날짜 주입 없음15%0%0%0%60%
날짜 주입 있음95%100%100%100%80%

날짜 주입 없이는 "작년 크리스마스"와 같은 Year granularity 상식 문제만 부분 정답(60%)이 가능하며, 실시간 계산이 필요한 Day/Week/Month는 전부 0%로 시간 추론 자체가 불가능합니다.

문제 상황: 4가지 설계 변수의 영향

날짜 프롬프트 설계 시 고려해야 할 4가지 변수와 각각의 성능 영향을 실험으로 검증했습니다.

1. Prompt Position: 어디에 넣을 것인가

PositionSimple ACCStructured ACC
System Prompt91.7%85.0%
User Prompt95.0%85.0%

User Prompt에 날짜 정보를 배치하면 질의와 가까운 위치에서 참조 효율이 높아져 Simple Response에서 +3.3%p 우위를 보였으며, Structured Output에서는 동일하므로 선택에 따른 손해가 없습니다.

2. Expression Format: 어떤 형식으로 넣을 것인가

테스트한 3가지 형식의 성능 비교:

Format예시SimpleStructured평균
Korean현재 날짜: 2025년 3월 19일92.5%95.0%93.8%
EnglishCurrent date: March 19th, 202595.0%80.0%87.5%
DayOfWeekCurrent date: 2025-03-19, Wed92.5%80.0%86.3%

Korean 형식이 가장 안정적입니다. Simple Response에서는 3개 format 간 차이가 미미(92.5~95.0%)하지만, Structured Output에서 Korean(95%)이 English/DayOfWeek(80%)를 크게 압도합니다. 이는 한국어 질의에 한국어 날짜 표현을 사용할 때 토큰 정렬이 자연스럽게 이루어지기 때문으로 추정됩니다.

3. 날짜 컨텍스트 상세도: 얼마나 많은 정보를 넣을 것인가

컨텍스트내용ACC
A날짜 + 시간 (현재 날짜: 2025-03-19 (수요일) / 현재 시간: 14:00)85~90%
B날짜 + 주간 달력 (이번 주/지난 주 전체 날짜 나열)85~90%
C날짜만 (현재 날짜: 2025-03-19 (Wed))80%

날짜만 제공하고 영문 요일만 포함한 경우(C) Week granularity에서 40%까지 하락했습니다. A/B처럼 한국어 요일을 포함하면 Week에서 80%를 유지할 수 있으며, 주간 달력(B)은 정보량 대비 성능 향상이 미미했습니다. 과도한 정보(주말 설명 등)를 추가하면 오히려 5~10%p 하락하므로 주의가 필요합니다.

4. Output 방식: 응답을 어떤 형식으로 받을 것인가

OutputACCWeek ACC
Simple (텍스트)95%100%
Structured (instructor)85%60%

시간 추론에서는 Simple Response가 유리합니다. 전체 정확도에서 +10%p 차이가 있으며, 핵심은 Week granularity(60% → 100%)입니다. Structured Output의 schema 강제가 추론 chain을 방해하는 것으로 분석되며, Structured가 필요한 경우 Korean format + User Prompt 조합으로 95%까지 보완 가능합니다.

해결 과정: Granularity별 난이도 분석

LLM의 시간 추론 능력은 시간 단위에 따라 극적으로 달라집니다:

순위GranularityACC 범위핵심 특성오류 패턴
1 (쉬움)Day100%단순 ±N일 산술오류 없음
2Month80~100%월말/월초 계산요일 역산에서 간헐적 오류
3Year60~100%상식 + 요일 계산먼 미래 요일 추론 실패
4 (어려움)Week40~100%요일 기반 상대 계산"다음 주 월요일" 등에서 ±1주 오류 빈번

Week Granularity가 가장 어려운 이유는 "다음 주 월요일" 같은 표현 해석 시 현재 요일 인식 → 주 경계 판단 → 날짜 계산의 3단계 추론이 필요하기 때문입니다. LLM이 "다음 주"의 경계를 잘못 판단하여 ±1주 오프셋 오류가 빈번하게 발생하며, Structured Output에서는 schema 제약이 이 추론 과정을 더욱 방해합니다.

주간 달력을 프롬프트에 포함하거나 상위 모델을 사용하면 개선 가능합니다:

모델DayWeekMonthYearOverall
gpt-4o-mini100%60%100%80%85%
gpt-4o100%100%100%100%100%

gpt-4o는 모든 granularity에서 100% 정확도를 달성하여 모델 크기가 시간 추론에 직접적 영향을 미치는 것을 확인했습니다.

결과: 권장 프롬프트 템플릿

실험 결과를 바탕으로 Best Practice: Korean + User Prompt 조합을 권장합니다:

# 기본 템플릿 (Simple: 95% / Structured: 95%)
system_prompt = """
사용자의 질문에 정확하게 답변하세요.
"""

user_prompt_template = """
현재 날짜: {year}년 {month}월 {day}일
사용자가 '오늘', '어제', '그저께', '금주', '지난주', '이번 달', '주말' 등
상대적 날짜 표현을 사용하면 위 현재 날짜를 기준으로 구체적인 날짜(YYYY-MM-DD)로 변환하세요.

{user_query}
"""

# 사용 예시
from datetime import datetime

now = datetime.now()
user_query = "지난주 금요일에 작성된 보고서를 찾아줘"

user_prompt = user_prompt_template.format(
year=now.year,
month=now.month,
day=now.day,
user_query=user_query
)

Week 정확도가 중요한 경우 주간 달력 추가:

# Week granularity 강화 템플릿 (Week: 80% → 100% for gpt-4o)
from datetime import datetime, timedelta

def get_week_calendar(reference_date):
# 이번 주 월요일 찾기
this_monday = reference_date - timedelta(days=reference_date.weekday())
# 지난 주 월요일
last_monday = this_monday - timedelta(days=7)

days_kr = ['월요일', '화요일', '수요일', '목요일', '금요일', '토요일', '일요일']

this_week = []
last_week = []

for i in range(7):
this_day = this_monday + timedelta(days=i)
last_day = last_monday + timedelta(days=i)
this_week.append(f"{days_kr[i]}({this_day.strftime('%Y-%m-%d')})")
last_week.append(f"{days_kr[i]}({last_day.strftime('%Y-%m-%d')})")

return this_week, last_week

now = datetime.now()
this_week, last_week = get_week_calendar(now)

user_prompt_with_calendar = f"""
현재 날짜: {now.year}{now.month}{now.day}일 ({['월요일','화요일','수요일','목요일','금요일','토요일','일요일'][now.weekday()]})
- 이번 주: {', '.join(this_week)}
- 지난 주: {', '.join(last_week)}

사용자가 '오늘', '어제', '그저께', '금주', '지난주', '이번 달', '주말' 등
상대적 날짜 표현을 사용하면 위 현재 날짜를 기준으로 구체적인 날짜(YYYY-MM-DD)로 변환하세요.

{user_query}
"""

피해야 할 안티패턴:

# ❌ 안티패턴 1: 날짜 정보 미주입
user_prompt_bad1 = """
사용자의 상대적 날짜 표현을 절대 날짜로 변환하세요.
{user_query}
"""
# → Day/Week/Month 0%, 전체 15%

# ❌ 안티패턴 2: 영문 날짜 + Structured Output
user_prompt_bad2 = """
Current date: March 19th, 2025
Convert relative date expressions to absolute dates.
{user_query}
"""
# + Structured Output → 80% (Week 40~60%)

# ❌ 안티패턴 3: 과도한 부가 설명
user_prompt_bad3 = """
현재 날짜: 2025년 3월 19일
주말은 토요일과 일요일을 의미합니다.
월말은 매월 마지막 날을 의미합니다.
...
{user_query}
"""
# → -5~10%p 하락

# ❌ 안티패턴 4: 날짜만 (요일 없이)
user_prompt_bad4 = """
Current date: 2025-03-19
{user_query}
"""
# → Week 40%

의사결정 가이드

프로젝트 상황에 따른 날짜 프롬프트 설계 의사결정 플로우:

1. 날짜 주입이 있는가?
└─ NO → 반드시 추가 (없으면 15%)
└─ YES → 다음 단계

2. 질의가 한국어인가?
└─ YES → Korean format 사용 ("2025년 3월 19일")
└─ NO → English format 사용 ("March 19th, 2025")

3. Structured Output이 필요한가?
└─ NO → Simple 사용 (최고 성능)
└─ YES → 반드시 Korean format + User Prompt 조합 (95% 보장)

4. Week 추론 정확도가 critical한가?
└─ NO → 기본 템플릿으로 충분
└─ YES → 주간 달력 추가 또는 gpt-4o 사용 고려

5. 전체 정확도 100%가 필요한가?
└─ NO → gpt-4o-mini + 최적 프롬프트 (95%)
└─ YES → gpt-4o 사용 (100%)

종합 권장 설정

항목권장값대안근거
Time Injection필수-미주입 시 15%
Expression FormatKoreanEnglish (Simple 한정)Structured에서 +15%p 차이
Prompt PositionUser PromptSystem Prompt (동등)Simple에서 +3.3%p
Output 방식SimpleStructured (Korean+User 시 95%)전체 +10%p, Week +40%p
날짜 컨텍스트날짜 + 한국어 요일주간 달력 (Week 중요 시)Week ACC 40→80%
부가 설명불필요-추가 시 오히려 하락
모델gpt-4o (정확도 우선)gpt-4o-mini (비용 우선)100% vs 85~95%

실험 환경 및 데이터

실험 구성:

  • Target LLM: gpt-4o-mini (baseline), gpt-4o (비교)
  • Temperature: 0.0
  • 기준 날짜: 2025-03-19 (Wednesday)
  • 테스트 쿼리: 20개 (Day 5 + Week 5 + Month 5 + Year 5)
  • 평가 메트릭: Accuracy — Include Match (정답 날짜가 응답에 포함되는지 판단)
  • 총 추론 수: 600개 (Baseline 320 + Expression Format 280)

상세 실험 데이터:

  • BASELINE_RESULTS.md: 날짜 컨텍스트 3종, seed/temp/output/model 비교 (320개 레코드)
  • EXPERIMENT_RESULTS.md: Expression Format × Injection Position 7-case (280개 레코드)

References